from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QListWidget, QLineEdit, QTextEdit, QInputDialog, QHBoxLayout, QVBoxLayout, QFormLayout
 
import json

'''Заметка в json'''
# notes = {
#     'Добро пожаловать': {
#         'текст': 'Это самое лучшее приложение для заметок в мире!',
#         'теги': ['добро', 'инструкция']
#     }
# }
# # сохраняем заметку в json файл
# with open('notes_data.json', 'w') as file:
#     json.dump(notes, file)

# объект приложения
app = QApplication([])

''' Интерфейс приложения '''
# объект окна
window = QWidget()
# задаем параметров
window.setWindowTitle('Умные заметки')
window.resize(900, 600)

# # виджеты окна приложения

# окно текста заметки
field_text = QTextEdit()

# окно списка заметок
list_notes = QListWidget()
list_notes_label = QLabel('Умные заметки')

# кнопки для заметок
btn_create_note = QPushButton('Создать заметку')
btn_delete_note = QPushButton('Удалить заметку')
btn_save_note = QPushButton('Сохранить заметку')

# окно списка тегов заметки
list_tags = QListWidget()
list_tags_label = QLabel('Список тегов')

# окно ввода тега
field_tag = QLineEdit()
field_tag.setPlaceholderText('Введите тег...')

# кнопки для тегов
btn_add_tag = QPushButton('Добавить к заметке')
btn_delete_tag = QPushButton('Открепить от заметки')
btn_search_tag = QPushButton('Искать заметки по тегу')

# # размещение виджетов по лэйаутам

# первый "столбец"
col1 = QVBoxLayout()
col1.addWidget(field_text)

# второй "столбец"
col2 = QVBoxLayout()
col2.addWidget(list_notes_label) # надпись
col2.addWidget(list_notes)       # список заметок

row1 = QHBoxLayout()             # 1 линия с кнопками
row1.addWidget(btn_create_note)
row1.addWidget(btn_delete_note)
row2 = QHBoxLayout()             # 2 линия с кнопками
row2.addWidget(btn_save_note)
# добавляем обе линии на 2 вертикальную
col2.addLayout(row1)
col2.addLayout(row2)

col2.addWidget(list_tags_label)
col2.addWidget(list_tags)
col2.addWidget(field_tag)

row3 = QHBoxLayout()             # 3 линия с кнопками
row3.addWidget(btn_add_tag)
row3.addWidget(btn_delete_tag)
row4 = QHBoxLayout()             # 4 линия с кнопками
row4.addWidget(btn_search_tag)
# добавляем обе линии на 2 вертикальную
col2.addLayout(row3)
col2.addLayout(row4)

# главная линия окна
layout_notes = QHBoxLayout()
layout_notes.addLayout(col1, stretch=2)
layout_notes.addLayout(col2, stretch=1)
# прикрепляем линию на окно
window.setLayout(layout_notes)

''' Функционал приложения '''

# функция для отображения заметки
def show_note():
    key = list_notes.selectedItems()[0].text()
    field_text.setText(notes[key]['текст'])
    list_tags.clear()
    list_tags.addItems(notes[key]['теги'])

# функция для создания заметки
def add_note():
    note_name, ok = QInputDialog(window, 'Добавить заметку', 'Название заметки:')
    if ok and note_name != '':
        notes[note_name] = {'текст': '', 'теги': []}
        list_notes.addItem(note_name)

# функция для сохранения заметки
def save_note():
    if list_notes.selectedItems():
        key = list_notes.selectedItems()[0].text()
        notes[key]['текст'] = field_text.toPlainText()
        with open('notes_data.json', 'w') as file:
            json.dump(notes, file, sort_keys=True, ensure_ascii=False)

list_notes.itemClicked.connect(show_note)

# показываем окно
window.show()

# with open('notes_data.json', 'r') as file:
#     notes = json.load(file)
# list_notes.addItems(notes)

# запускаем приложение
app.exec_()